/**
 * @addtogroup bsc_gnss_nmea_parser
 * bsc_gnss_nmea_parser
 * @{
 */
/**
 * @file         bsc_gnss_nmea_parser.h
 * @brief        Nmea解析器
 * @note    
 * @author       Akee(ysk@hopechart.com，尤胜坤)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-11-22  <td>1.0                   <td>Akee            <td>创建初始版本
 * <tr><td>2022-08-10  <td>1.1                   <td>Akee            <td>文件名从gnss_nmea_parse改为gnss_nmea_parser
 * <tr><td>2022-10-28  <td>1.2                   <td>Akee            <td>文件名从gnss_nmea_parser改为bsc_gnss_nmea_parser
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_GNSS_NMEA_PARSER_H_
#define _BSC_GNSS_NMEA_PARSER_H_

#include "ofc/ofc_types.h"
#include "nmea/nmea_tokenizer.h"
#include "nmea/nmea_parser.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Nmea消息参数
 */
typedef struct TBsGnssNmeaParserMsgParamTag TBsGnssNmeaParserMsgParam;
struct TBsGnssNmeaParserMsgParamTag
{
    Int16 stream_len;  ///< 数据流的长度
    UInt8 *stream;     ///< 数据流"$GPRMC,133306.00,A,3949.63075,N,11616.48616,E,0.513,,120116,,,A*"
};

typedef void (*TBsGnssNmeaParserDoMsg)(void *sender, TNmeaTokenizer *tokens, TNmeaAddrField *addr, TBsGnssNmeaParserMsgParam *msg_param);

/**
 * Nmea0183解析器
 */
typedef struct TBsGnssNmeaParserTag TBsGnssNmeaParser;
struct TBsGnssNmeaParserTag
{
    UInt8 *recv_buf_;
    UInt16 recv_buf_size_;
    UInt16 recv_size_;

    TBsGnssNmeaParserDoMsg DoMsg_;
    void *do_msg_object_;
};

/**
 * 构造函数
 * @param self: 对象指针
 * @param recv_buf: 接收缓存
 * @param recv_buf_size: 接收缓存大小，若是标准协议，则建议输入不小于210，私有协议需要自己确定
 * @return 
 * @note 
    标准最大帧长定义：
        GGA: 72
        GSA: 65
        GSV: 210
        RMC: 70
 */
void TBsGnssNmeaParserCreate(TBsGnssNmeaParser *self, UInt8 *recv_buf, UInt16 recv_buf_size);

/**
 * 设置消息处理回调指针
 * @param self: 对象指针
 * @param do_msg: 消息回调函数
 * @param do_msg_user_param: 消息回调函数用户参数
 * @return
 */
void TBsGnssNmeaParserSetOnMsg(TBsGnssNmeaParser *self, TBsGnssNmeaParserDoMsg do_msg, void *do_msg_user_param);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TBsGnssNmeaParserDestroy(TBsGnssNmeaParser *self);

/**
 * 设置消息处理回调指针
 * @param self: 对象指针
 * @param data: 接收的数据
 * @param data_size: 接收的数据大小
 * @return
 */
void TBsGnssNmeaParserOnRead(TBsGnssNmeaParser *self, const UInt8 *data, Int32 data_size);
#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
 
 
 

